/*
 * list.h
 *
 *  Created on: Nov 26, 2008
 *      Author: marco
 */

typedef struct node {
	int val;
	struct node * next;
} node;

typedef node * list;


list new_node(int val);

void free_node(list l);

void insert(list l, list n);

list del_next(list l);

int val(list l);

/* @description -- ritorna il puntatore del secondo elemento della lista l
   @param l -- una lista (con numero arbitrario di elementi >=1)
   @return -- il puntatore al secondo elemento
    */
list next (list l);


/* @description -- costruisce una nuova lista in cui ogni elemento e' ottenuto applicando f al corrispondente elemento di i
   @param l -- una lista (con numero arbitrario di elementi >=0)
   @param f -- la funzione da mappare
   @return -- il puntatore al primo element odella lista creata
*/
list map (int (*f) (int), list l);
/* @description -- combina gli elementi della lista l usando un operatore binario associativo
   @param l -- una lista (con numero arbitrario di elementi >=0)
   @param f -- l'operatore binario
   @param en -- l'elemento neutro di f

   @return -- la 'somma' degli elementi di l secondo f (l1 f l2 f ... f lN f en) */
int reduce(int (*f) (int,int), int en, list l);








